package com.iocollege.tinyframe.service.system.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.iocollege.tinyframe.common.core.constant.UserConstants;
import com.iocollege.tinyframe.common.exception.CustomException;
import com.iocollege.tinyframe.common.service.impl.BaseMyService;
import com.iocollege.tinyframe.common.utils.SpringUtils;
import com.iocollege.tinyframe.common.utils.StringUtils;
import com.iocollege.tinyframe.entity.system.SysRole;
import com.iocollege.tinyframe.entity.system.SysRoleMenu;
import com.iocollege.tinyframe.mapper.system.SysRoleMapper;
import com.iocollege.tinyframe.service.system.SysRoleService;
import com.iocollege.tinyframe.service.system.SysUserRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * <p>
 * 角色信息表 服务实现类
 * </p>
 *
 * @author 关注公众号：MarkerHub
 * @since 2021-03-22
 */
@Service
public class SysRoleServiceImpl extends BaseMyService<SysRoleMapper, SysRole> implements SysRoleService {



    /**
     * 根据用户ID获取角色选择框列表
     *
     * @param userId 用户ID
     * @return 选中角色ID列表
     */
    @Override
    public List<Integer> selectRoleListByUserId(Long userId)
    {
        return baseMapper.selectRoleListByUserId(userId);
    }


    /**
     * 读取用户允许的角色
     * @param userId 用户ID
     * @return
     */
    @Override
    public Set<String> selectRolePermissionByUserId(Long userId) {
        List<SysRole> perms = this.baseMapper.selectRolesByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (SysRole perm : perms)
        {
            if (StringUtils.isNotNull(perm))
            {
                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
            }
        }
        return permsSet;
    }

    /**
     * 读取用户的全部角色
     * @param userId
     * @return
     */

    @Override
    public List<SysRole> selectRolesByUserId(Long userId) {


        return this.baseMapper.selectRolesByUserId(userId);
    }


    /**
     * 校验角色名称是否唯一
     *
     * @param role 角色信息
     * @return 结果
     */
    @Override
    public String checkRoleNameUnique(SysRole role)
    {
        Long roleId = StringUtils.isNull(role.getId()) ? -1L : role.getId();
        SysRole info = this.baseMapper.checkRoleNameUnique(role.getRoleName());
        if (StringUtils.isNotNull(info) && info.getId().longValue() != roleId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验角色权限是否唯一
     *
     * @param role 角色信息
     * @return 结果
     */
    @Override
    public String checkRoleKeyUnique(SysRole role)
    {
        Long roleId = StringUtils.isNull(role.getId()) ? -1L : role.getId();
        SysRole info = this.baseMapper.checkRoleKeyUnique(role.getRoleKey());
        if (StringUtils.isNotNull(info) && info.getId().longValue() != roleId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验角色是否允许操作
     *
     * @param role 角色信息
     */
    @Override
    public void checkRoleAllowed(SysRole role)
    {
        if (StringUtils.isNotNull(role.getId()) && role.isAdmin())
        {
            throw new CustomException("不允许操作超级管理员角色");
        }
    }

    /**
     * 通过角色ID查询角色使用数量
     *
     * @param roleId 角色ID
     * @return 结果
     */
    @Override
    public int countUserRoleByRoleId(Long roleId)
    {
        return this.baseMapper.countUserRoleByRoleId(roleId);
    }
    /**
     * 修改保存角色信息
     *
     * @param role 角色信息
     * @return 结果
     */
    @Override
    @Transactional
    public int updateRole(SysRole role)
    {
        // 修改角色信息
       return  this.baseMapper.updateById(role);

    }
    /**
     * 查询所有角色
     *
     * @return 角色列表
     */
    @Override
    public List<SysRole> selectRoleAll()
    {
        return selectRoleList(new SysRole());
    }
    /**
            * 根据条件查询角色数据
     *
             * @param role 角色信息
     * @return 角色数据集合信息
     */
    @Override
//    @DataScope(deptAlias = "d")
    public List<SysRole> selectRoleList(SysRole role)
    {
        role.setDelFlag("0");//不允许出来已经删除的

        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.setEntity(role);
        return this.baseMapper.selectList(queryWrapper);
    }




}
